package com.leetcode.binary_search;

import java.util.Arrays;

/**
 * @author Dennis Li
 * @date 2020/9/24 15:26
 */
public class MinEatingSpeed_875 {
    public int minEatingSpeed(int[] piles, int H) {
        // 凡是线性区间查找，都可以转换为二分，节省时间
        int i = 1, j = Arrays.stream(piles).max().getAsInt();
        while (i < j) {
            int mid = i + (j - i) / 2;
            if (canEatUp(piles, mid, H)) {
                // 向左收缩边界
                // 如果是向右收缩，那么就是在满足条件的时候i = mid + 1
                j = mid;
            } else {
                i = mid + 1;
            }
        }
        return i;
    }

    // 判断能否吃完
    private boolean canEatUp(int[] piles, int mid, int h) {
        return h >= Arrays.stream(piles).map(pile -> pile % mid == 0 ? pile / mid : pile / mid + 1).sum();
    }

}
